home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / usr / lib / pm-utils / pm-functions < prev   
Text File  |  2008-10-15  |  6KB  |  232 lines

  1. #!/bin/sh
  2. # vim:noexpandtab
  3.  
  4.  
  5. # Default values go here.  It is important to _not_ initialize some
  6. # variables here.  They are:
  7. #
  8. # PM_CMDLINE
  9. # RESUME_MODULES
  10. #
  11. # for great debugging!
  12. [ "${PM_DEBUG}" = "true" ] && {
  13.     export PM_DEBUG
  14.     set -x
  15. }
  16. set -a
  17. PM_UTILS_LIBDIR="/usr/lib/pm-utils"
  18. PM_UTILS_ETCDIR="/etc/pm"
  19. PM_UTILS_RUNDIR="/var/run/pm-utils"
  20.  
  21. PATH=/sbin:/usr/sbin:/bin:/usr/bin:"${PM_UTILS_LIBDIR}"/bin
  22. INHIBIT="${PM_UTILS_RUNDIR}/inhibit"
  23. PM_LOGFILE="${PM_LOGFILE:=/var/log/pm-suspend.log}"
  24. TEMPORARY_CPUFREQ_GOVERNOR="performance"
  25. LOCKDIR="${PM_UTILS_RUNDIR}/locks"
  26. STORAGEDIR="${PM_UTILS_RUNDIR}/storage"
  27. NA=254
  28. NX=253
  29. DX=252
  30. PM_FUNCTIONS="$PM_UTILS_LIBDIR/functions"
  31. # Use c sort order
  32. LC_COLLATE=C
  33.  
  34. # These should be overridden by defaults and/or config.d settings.
  35. # Specifically, distros should override these by modifying defaults,
  36. # and end users should modify these using files in /etc/pm/config.
  37. HIBERNATE_MODE=""
  38. HIBERNATE_RESUME_POST_VIDEO="no"
  39. SLEEP_MODULE="kernel"
  40. # These variables will be handled specially when we load the config file.
  41. SUSPEND_MODULES=""
  42. HOOK_BLACKLIST=""
  43. ADD_PARAMETERS=""
  44. DROP_PARAMETERS=""
  45. PARAMETERS="${STORAGEDIR}/parameters"
  46. PM_CMDLINE="$*"
  47.  
  48. [ -f "${PM_UTILS_LIBDIR}"/defaults ] && . "${PM_UTILS_LIBDIR}"/defaults
  49.  
  50. set +a
  51.  
  52. for cfg in "${PM_UTILS_ETCDIR}"/config.d/*[!~] ; do
  53.     [ -f "$cfg" ] || continue
  54.     # Ugly, I know. The goal here is to allow multiple files in
  55.     # /etc/pm/config.d declare these variables and have those 
  56.     # declarations add together instead of the last one overwriting
  57.     # all the others.
  58.     [ "$SUSPEND_MODULES" ] && REAL_SUSPEND_MODULES="$SUSPEND_MODULES"
  59.     [ "$HOOK_BLACKLIST" ] && REAL_HOOK_BLACKLIST="$HOOK_BLACKLIST"
  60.     [ "$ADD_PARAMETERS" ] && REAL_ADD_PARAMETERS="$ADD_PARAMETERS"
  61.     [ "$DROP_PARAMETERS" ] && REAL_DROP_PARAMETERS="$DROP_PARAMETERS"
  62.     set -a
  63.     . "${cfg}"
  64.     SUSPEND_MODULES="$REAL_SUSPEND_MODULES $SUSPEND_MODULES"
  65.     HOOK_BLACKLIST="$REAL_HOOK_BLACKLIST $HOOK_BLACKLIST"
  66.     ADD_PARAMETERS="$REAL_ADD_PARAMETERS $ADD_PARAMETERS"
  67.     DROP_PARAMETERS="$REAL_DROP_PARAMETERS $DROP_PARAMETERS"
  68.     set +a
  69. done
  70.  
  71. . "${PM_FUNCTIONS}"
  72.  
  73. # Simple little logging function.
  74. # We do it this way because 'echo -n' is not posix.
  75. log()
  76. {
  77.     [ $LOGGING ] || return;
  78.     local fmt='%s\n'
  79.     [ "$1" = "-n" ] && { fmt='%s'; shift; }
  80.     printf "$fmt" "$*"
  81. }
  82.  
  83. # update PM_CMDLINE iff someone changed our parameters
  84. update_parameters()
  85. {
  86.     [ -f "$PARAMETERS.new" ] || return
  87.     export PM_CMDLINE="$(get_parameters)"
  88.     rm -f "$PARAMETERS.new"
  89. }
  90.  
  91. # if the user asked us to blacklist any hooks, do it.
  92. load_hook_blacklist()
  93. {
  94.     [ "$HOOK_BLACKLIST" ] || return
  95.     local hook
  96.     for hook in $HOOK_BLACKLIST; do
  97.         disablehook "${hook}" "blacklisted by user"
  98.         log "Blacklisting ${hook}."
  99.     done
  100. }
  101.  
  102. load_hook_parameters()
  103. {
  104.     [ "$DROP_PARAMETERS" ] && remove_parameters $DROP_PARAMETERS
  105.     [ "$ADD_PARAMETERS" ]  && add_parameters $ADD_PARAMETERS
  106.     update_parameters
  107. }
  108.  
  109. take_suspend_lock()
  110. {
  111.     try_lock "pm-utils.lock" || return 1
  112.     # clean up from the last run
  113.     rm -rf "${STORAGEDIR}"
  114.     mkdir -p "${STORAGEDIR}"
  115.         # save our parameter list.
  116.     [ -f "$PARAMETERS" ] || echo '' >"$PARAMETERS"
  117.     add_parameters $PM_CMDLINE
  118.     update_parameters
  119.     return 0
  120. }
  121.  
  122. remove_suspend_lock()
  123. {
  124.     release_lock "pm-utils.lock"
  125. }
  126.  
  127. hook_exit_status(){
  128.     case $1 in
  129.         0)   log "success." ;;
  130.         $NA) log "not applicable." ;;
  131.         $NX) log "not executable." ;;
  132.         $DX) log "disabled." ;;
  133.         *)   log "Returned exit code $1." ;;
  134.     esac
  135. }
  136.  
  137. # check to see if a hook is a candidate for being run.
  138. hook_ok()
  139. {
  140.     local hook="${1##*/}"
  141.     # the actual name as passed to us.
  142.     [ -f "$STORAGEDIR/disable_hook:$hook" ] && return $DX
  143.     # name with leading digits chopped off the filename
  144.     [ -f "$STORAGEDIR/disable_hook:${hook#[0-9][0-9]}" ] && return $DX
  145.     [ -x "$1" ] || return $NX
  146.     return 0
  147. }
  148.  
  149. # Run all applicable hooks, logging success and failure as we go.
  150. run_hooks() {
  151.     # $1 = type of hook to find.  
  152.     # $2 = paramaters to pass to hooks.
  153.     # $3 = if present and equal to "reverse", run hooks backwards.
  154.     # Currently only power and sleep are meaningful.
  155.     local syshooks="${PM_UTILS_ETCDIR}/$1.d"
  156.     local phooks="${PM_UTILS_LIBDIR}/$1.d"
  157.     command_exists before_hooks && before_hooks
  158.     local sort="sort"
  159.     local base
  160.     local hook
  161.     local oifs="${IFS}"
  162.     # the next two lines are not a typo or a formatting error!
  163.     local nifs="
  164. "
  165.     IFS="${nifs}" # tolerate spaces in filenames.
  166.     [ "$3" = "reverse" ] && sort="sort -r"
  167.     for base in $(IFS="${oifs}"; for f in "$syshooks/"*[!~] "$phooks/"*[!~];
  168.         do [ -O "$f" ] && echo ${f##*/} ; done | $sort | uniq) ;
  169.     do
  170.         IFS="${oifs}"
  171.         if [ -f "$syshooks/$base" ]; then
  172.             hook="$syshooks/$base"
  173.         elif [ -f "$phooks/$base" ]; then
  174.             hook="$phooks/$base"
  175.         fi
  176.         log -n "${hook} $2: "
  177.         hook_ok "$hook" && "${hook}" $2
  178.         hook_exit_status $?
  179.         update_parameters
  180.         IFS="${nifs}"
  181.     done
  182.     IFS="${oifs}"
  183. }
  184.  
  185. # Try to reinitalize the logfile. Fail unless certian criteria are met.
  186. init_logfile()
  187. {
  188.     if [ -z "$1" ]; then
  189.         echo "Please pass a filename to init_logfile."
  190.         return 1    
  191.     elif [ -h "$1" ]; then
  192.         echo "$1 is a symbolic link, refusing to overwrite."
  193.         return 1
  194.     elif [ -f "$1" -a ! -O "$1"  ]; then
  195.         echo "We do not own $1, refusing to overwrite."
  196.         return 1
  197.     fi
  198.     export LOGGING=true
  199.     exec > "$1" 2>&1
  200. }
  201.  
  202. check_suspend_pmu()
  203. {
  204.     perl << EOF
  205. sub PMU_IOC_CAN_SLEEP { 0x40044205; }
  206. open PMU, '/dev/pmu' or die "open /dev/pmu: \$!";
  207. \$p = pack 'l', 0;
  208. ioctl PMU, &PMU_IOC_CAN_SLEEP, \$p or die "ioctl: \$!";
  209. (\$v) = unpack 'l', \$p;
  210. exit (\$v ? 0 : 1);
  211. EOF
  212. }
  213.  
  214. do_suspend_pmu()
  215. {
  216.     perl << EOF
  217. sub PMU_IOC_SLEEP { 0x20004200; }
  218. open PMU, "/dev/pmu" or die "open /dev/pmu: \$!";
  219. ioctl PMU, &PMU_IOC_SLEEP, 0;
  220. EOF
  221. }
  222.  
  223.  
  224. SLEEP_FUNCTIONS="${PM_UTILS_LIBDIR}/module.d/${SLEEP_MODULE}"
  225. [ -f "${SLEEP_FUNCTIONS}" ] || { 
  226.     echo "Requested sleep module $SLEEP_MODULE not available."
  227.     exit 1
  228. }
  229.  
  230. . "${SLEEP_FUNCTIONS}"
  231.  
  232.